C++의 이름 가리기 규칙은 클래스에서도 동일하게 적용된다.
class Base{
private:
int x;
public:
virtual void mf1()=0;
virtual void mf2();
void mf3();
};
class Derived: public Base{
public:
virtual void mf1();
void mf4();
};
void Drived::mf4(){
mf2();
}
클래스에서 함수를 찾을 때(위에서 mf2()를 수행할 때),
가장 먼저 해당 스코프에서 함수를 찾고(위에서 Derived::mf4),
그 다음 해당 클래스에서 함수를 찾는다(위에서 Derived class)
이 후, 상속한 클래스에서 함수를 찾고(위에서 Base class)
마지막에 전역 유효범위에서 찾는다.
class Base{
private:
int x;
public:
virtual void mf1()=0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
};
class Derived: public Base{
public:
virtual void mf1();
void mf3();
void mf4();
};
Derived d;
int x;
d.mf1();
d.mf1(x);
d.mf2();
d.mf3();
d.mf3(x);
이름가리기는 기본 클래스와 파생 클래스에 있는 함수들이 받아들이는
매개변수 타입을 구분하지 않는다.
함수가 가상함수인지 비가상함수인지의 여부에도 상관없이 이름을 가림
가려진 이름을 사용하기 위해서 using 선언을 사용한다.
class Base{
private:
int x;
public:
virtual void mf1()=0;
virtual void mf1(int);
virtual void mf2();
void mf3();
void mf3(double);
};
class Derived: public Base{
public:
using Base::mf1;
using Base::mf3;
virtual void mf1();
void mf3();
void mf4();
};
Derived d;
int x;
d.mf1();
d.mf1(x);
d.mf2();
d.mf3();
d.mf3(x);
private 상속private 상속을한 경우,
using 선언을 사용할 수 없다.(using 선언시 모든 함수가 파생 클래스로 내려감, private 상속한 이유가 없음)
전달함수(forwarding function)을 사용할 것
class Base{
public:
virtual void mf1()=0;
virtual void mf1(int);
};
class Derived: private Base{
public:
virtual void mf1(){
Base::mf1();
}
};
Derived d;
int x;
d.mf1();
d.mf1(x);